﻿#ifndef README_H
#define README_H
/***********************************************************************
 *  COPYRIGHT NOTICE
 *	Copyright(c) 2017-2018,塔米智能科技（北京）有限公司
 *	All rights reserved.
 *	@file       readme.h
 *	@version	1.0
 *	@author		张利利
 *	@date		2017年08月30日
 *  编译环境：windows qt5.6.2 MSVC
 *
 ***********************************************************************/

/***********************************************************************
 *  新架构优点，我们希望新框架解决的问题：
 *  1.组件化、松耦合
 *      节省编译时间及增量升级包大小，可根据情况可单独升级各自模块
 *  2.统一的线程任务调度模型
 *      一方面，避免不同业务为各自方便，随意创建产生的无意义线程
 *      另一方面，避免大量耗时操作无故占用主线程，影响界面UI响应速度
 *  3.限制线程与模块调用方式
 *      保证资源统一
 *      凡事都有条件
 *      做事要有计划 对结果要有预见性
 *  4.开发独立、代码少依赖
 *      组件开发期间，减少代码依赖，增强开发人员的独立编码和测试
 *      各组件只提供一个define.h文件即可，文件中包含必要的预定义信息
 *  5.业务驱动界面模型
 *      界面方案的变更，只需更改界面即可，无需重构其它子系统
 *      界面与业务完全无关，业务层只需定义本业务需要的界面支持即可
 *      界面的实现完全在UI层控制
 *  6.可扩展、可接入
 *      可以很方便的扩展或卸载模块。
 *  7.层次分明，切割合理
 *      纵向按业务切割模块；
 *  8.限制开发人员的不良习惯
 *      例如: 规范、统一、共谋发展
 *            函数实现过长
 *            新增业务无限case
 *            基础方法使用不合理
 *            业务了解不清晰等
 *  9.固化核心、布进发布
 *      主框架模块完成所有预定义模块的功能及数据流转
 *      框架开发完成后，做到在后续的开发中，基本不再修改主框架模块
 *      按基本功能、高级功能、增值功能的顺序 进行设计与开发，顺序接入系统
 *
 ************************************************************************/

/***********************************************************************
 *  使用说明：
 *      1.TmRobotClient仅实现界面效果展示，涉及到的数据需定义具体函数实现。
 *      2.UI模块对应TmRobotClient的业务逻辑实现；
 *      3.Public为除了UI界面业务逻辑实现外，其它的业务逻辑的实现；
 *      4.此框架中分五个线程：程序主线程、界面线程、业务线程1、业务线程2、日志线程；
 *      5.要完成一件事，首先要CreateTask, 再AddTask，可定义在哪个模块处理过程，在哪个模块得到结果。（受线程限制）
 *      6.同一个线程中，不能再次CreateTask,AddTask到此线程中。
 ************************************************************************/

/***********************************************************************
 *  架构基础知识点：
 *  1.C++标准转换运算符：
 *      a.编译器的属性设置、牵扯面向对象的多态性跟程序运行的状态；
 *      b.用来检测目标对象和源对象是否有继承关系；
 *      c.static_cast和reinterpret_cast运算符或直接被编译器拒绝进行转换，或一定能得到相应的目标类型的值；
 *      d.dynamic_cast会进行判别，确定源指针所指的内容，是否合法。如果否返回null，受编译器影响。
 *  2.虚函数对dynamic_cast的作用：
 *      在C++的面向对象思想中，虚函数起到了关键的作用。当类中有虚函数时，编译器会构建虚函数表来指示这些函数
 *      的地址，假如继承该类的子类定义并实现了一个同名并具有同样函数签名的方法重写了基类中的方法，那么虚函数
 *      表会将该函数指向新的地址，此时多态性得以体现：当我们将基类的指针或引用指向子类的对象的时候，调用方法
 *      时，就会顺着虚函数表找到对应子类的方法。
 *  4.模板：模板是一种对类型进行参数化的工具；
 *          通常分为：函数模板 和 类模板；
 *          函数模板针对仅数据成员 和 成员函数类型不同的类；
 *      使用模板的目的是 能够让程序员编写与类型无关的代码。
 *    类模板：为生成通用的类声明提供了一种更好的方法；类模板使得能够创建通用的类设计。
 *    类定义（实例化）在声明类对象并指定特定类型时生成。class ITModelBaseImpl<ICheckIn> 此声明导致编译器生成类声明，
 * 用声明中的实际类型ICheckIn替换模板类型。编译器将使用通用模板生成一个ICheckIn的具体化，虽然尚未请求这个类的对象。
 *
 *  5.泛型：变量类型的参数化。（基本思想与C++模板中的思想较类似）泛型的一个重要作用就是为了避免强制类型的转换，
 *      定义的时候逻辑与之前的相同，涉及到具体的类型信息的时候，用一个符号来代替（所谓类型的参数化），不变应万变。
 *
 *  class ITModelBase{
 *  public:
 *      virtual ~ITModelBase() {}
 *      virtual void Invoke(const TArgs *pArg) TPURE;
 *  };
 *
 *  template<class T> / template <typename T>
 *  class ITModelBaseImpl : public T{
 *  public:
 *      virtual void Invoke(const TArgs* pArgs){
 *          return;
 *      }
 *  };
 *  #define T_DECLARE_INVOKE
 *  public:
 *      virtual void Invoke(const TArgs* pArgs);
 *
 *  #define T_BEGIN_MAP(T)
 *      void T::Invoke(const TArgs* pArgs)
 *      {
 *          #define T_HANDLER(CmdId, FuncName, InArgs, OutArgs)
 *              if(CmdId == pArgs->CommandID)
 *              {
 *                  FuncName(static_cast<InArgs*>(pArgs->CommandArgs),static_cast<OutArgs*>(pArgs->CommandRst));
 *                  return;
 *              }
 *  #define T_END_MAP
 *          return;
 *      }
 *
 *  class ICheckIn : public ITModelBase{ null }
 *  class CheckIn : public ITModelBaseImpl<ICheckIn>
 *  dynamic_cast<ITModelBase*>(CheckIn*);
 *
 *  T_BEGIN_MAP(CheckIn)
 *      T_HANDLER(1,OnSend,TObject,TObject)
 *      T_HANDLER(2,OnRecv,TObject,TObject)
 *  T_END_MAP
 *
 ************************************************************************/

/***********************************************************************
 * 配置文件及define.h中定义用法：
 * ./module/public.xml、ui.xml, 配置public模块和ui模块动态库的加载与卸载
 * 1. id与include/moduleid.h中的模块宏定义一一对应；
 * 2. loadorder/unloader需按照顺序写，保证唯一；
 * 3. 各模块中的define.h中的CMD_ID应该以include/moduleid.h中的对应模块宏定义
 * 值作为起始，按顺序递加，因为此CMD_ID除了创建任务时会使用外，在UI模块对应的
 * 回调函数中亦可用到，所以需要保持ui-show与UI模块下的各模块的配对中的CMD_ID
 * 的唯一性；
 ************************************************************************/


#endif // README_H
